/**
 * Fichier Utilisateur.java : Définition de classe
 * fr.unice.gnpt.gui.utilisateur.Utilisateur : Fonction de l'utilisateur
 * 
 * Auteurs : Groupe GNPT : Gastinel, Nicolas, Pellegrino, Trovato
 */
package fr.unice.gnpt.gui.utilisateur;

import java.util.Collection;
import java.util.Collections;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.TableRowSorter;

import net.miginfocom.swing.MigLayout;
import fr.unice.gnpt.Main;
import fr.unice.gnpt.core.Cours;
import fr.unice.gnpt.core.Enseignant;
import fr.unice.gnpt.core.Enseignement;
import fr.unice.gnpt.core.Service;
import fr.unice.gnpt.core.TacheAdministrative;
import fr.unice.gnpt.core.dao.DaoCours;
import fr.unice.gnpt.core.dao.DaoEnseignant;
import fr.unice.gnpt.core.dao.DaoException;
import fr.unice.gnpt.core.dao.DaoService;
import fr.unice.gnpt.core.dao.factory.FabriqueDao;
import fr.unice.gnpt.gui.Interface;
import fr.unice.gnpt.gui.listeners.InterfaceListener;
import fr.unice.gnpt.gui.util.EnsLibreTableModel;
import fr.unice.gnpt.gui.util.HeureEnseignantTableModel;
import fr.unice.gnpt.gui.util.Rectangle;
import fr.unice.gnpt.gui.util.ServiceEnsTableModel;
import fr.unice.gnpt.gui.util.ServiceTAdminTableModel;
import fr.unice.gnpt.gui.util.ValidationRenderer;

/**
 * Classe de fontions de l'utilisateur.
 * <p>
 * L'utilisateur peut être un enseignant ou un coordonateur, ce qui a de
 * l'importance sur les données à afficher. Cependant la structure de base de
 * l'application reste inchangée. Donc les méthodes gérant la création des
 * différentes parties graphiques seront adaptées à chaque type d'utilisateur.
 * 
 * @author gnpt
 * @version 0.0.1
 */
public abstract class Utilisateur {
	private ServiceEnsTableModel ensTableModel;
	private JTable tableEns;
	private ServiceTAdminTableModel tAdminTableModel;
	private JTable tableTAdmin;
	private EnsLibreTableModel ensDispoTableModel;
	private JTable tableEnsDispo;
	private JPanel contenuEns = null;
	private JPanel contenuTAdmin = null;
	private JPanel cadreGauche = null;
	private JPanel formulaire = null;
	private JPanel formulaireTA = null;
	private JPanel informations = null;
	private JComboBox listeCours = null;
	private JComboBox listeEnseignants = null;
	private InterfaceListener listener;
	private Collection<Service> collServices = null;
	private Collection<Enseignement> collEnseignements = null;
	private Collection<TacheAdministrative> collTachesAdministratives = null;
	private Collection<Cours> collCours = null;
	private Collection<Enseignant> collEnseignants = null;
	private FabriqueDao fab;
	private JPanel contenuEnsDispo;
	private JPanel contenuEnseignantHSup;
	private JTable tableEnseignantHSup;
	private HeureEnseignantTableModel enseignantHSupTableModel;
	private Interface frame;

	/**
	 * Constructeur par défaut.
	 * 
	 * @param parent
	 *            l'interface qui contient cet objet.
	 */
	public Utilisateur(Interface parent) {
		this.ensTableModel = new ServiceEnsTableModel();
		this.setTableEns(new JTable());
		this.tAdminTableModel = new ServiceTAdminTableModel();
		this.setTableTAdmin(new JTable());
		this.ensDispoTableModel = new EnsLibreTableModel(this);
		this.setTableEnsDispo(new JTable());
		this.enseignantHSupTableModel = new HeureEnseignantTableModel(this);
		this.setTableEnseignantHSup(new JTable());

		this.frame = parent;

		this.listener = this.frame.getListener();
		this.creerInformations();

		try {
			this.fab = FabriqueDao.getFabriqueDao();
		} catch (DaoException e) {
			Main.getJournal().logException(e);
		}
	}

	/**
	 * Crée le contenu pour les enseignements.
	 */
	public void creerContenuEns() {
		this.contenuEns = new JPanel(new MigLayout("", "0[grow,fill]0",
				"0[grow,fill]0"));

		Main.getJournal().logInfo("Utilisateur: Récupération des données");

		this.getEnsTableModel().setDonnees(this.getCollEnseignements());
		this.setTableEns(new JTable(this.getEnsTableModel()));
		this.setTableEns(this.getTableEns());

		// On fixe la hauteur des lignes à 25 pixels chacune
		this.getTableEns().setRowHeight(25);

		// Ajuste la taille des trois dernières colonnes à 50 pixels
		int width = 60;
		this.getTableEns().getColumnModel().getColumn(2).setPreferredWidth(
				width);
		this.getTableEns().getColumnModel().getColumn(3).setPreferredWidth(
				width);
		this.getTableEns().getColumnModel().getColumn(4).setPreferredWidth(
				width);
		this.getTableEns().getColumnModel().getColumn(2).setMaxWidth(width);
		this.getTableEns().getColumnModel().getColumn(3).setMaxWidth(width);
		this.getTableEns().getColumnModel().getColumn(4).setMaxWidth(width);

		JScrollPane scrollPane = new JScrollPane(this.getTableEns());
		this.getTableEns().setFillsViewportHeight(true);

		this.contenuEns.add(scrollPane);
	}

	/**
	 * Panel des enseignements.
	 * 
	 * @return le contenu.
	 */
	public JPanel getContenuEns() {
		if (this.contenuEns == null)
			this.creerContenuEns();

		return this.contenuEns;
	}

	/**
	 * Crée le contenu pour les tahes administratives.
	 */
	public void creerContenuTAdmin() {
		this.contenuTAdmin = new JPanel(new MigLayout("", "0[grow,fill]0",
				"0[grow,fill]0"));

		this.getTAdminTableModel().setDonnees(
				this.getCollTachesAdministratives());
		this.setTableTAdmin(new JTable(this.getTAdminTableModel()));
		this.setTableTAdmin(this.getTableTAdmin());
		JScrollPane scrollPane = new JScrollPane(this.getTableTAdmin());
		this.getTableTAdmin().setFillsViewportHeight(true);

		this.getTableTAdmin().setRowHeight(25);

		this.contenuTAdmin.add(scrollPane);
	}

	/**
	 * Panel des tâches administratives.
	 * 
	 * @return le contenu.
	 */
	public JPanel getContenuTachesAdmin() {
		if (this.contenuTAdmin == null)
			this.creerContenuTAdmin();
		return this.contenuTAdmin;
	}

	/**
	 * Crée le contenu pour les enseignements libres.
	 */
	public void creerContenuEnsDispo() {
		this.contenuEnsDispo = new JPanel(new MigLayout("", "0[grow,fill]0",
				"0[grow,fill]0"));

		this.setTableEnsDispo(new JTable(this.getEnsDispoTableModel()));
		this.setTableEnsDispo(this.getTableEnsDispo());

		JScrollPane scrollPane = new JScrollPane(this.getTableEnsDispo());
		this.getTableEnsDispo().setFillsViewportHeight(true);

		this.getTableEnsDispo().setRowHeight(25);

		this.contenuEnsDispo.add(scrollPane);
	}

	/**
	 * Panel des enseignements libres.
	 * 
	 * @return le contenu.
	 */
	public JPanel getContenuEnsDispo() {
		if (this.contenuEnsDispo == null)
			this.creerContenuEnsDispo();
		return this.contenuEnsDispo;
	}

	/**
	 * Crée le contenu pour les enseignements libres.
	 */
	public void creerContenuEnseignantHSup() {
		this.contenuEnseignantHSup = new JPanel(new MigLayout("",
				"0[grow,fill]0", "0[grow,fill]0"));

		this.setTableEnseignantHSup(new JTable(this
				.getEnseignantHSupTableModel()));
		this.setTableEnseignantHSup(this.getTableEnseignantHSup());

		JScrollPane scrollPane = new JScrollPane(this.getTableEnseignantHSup());
		this.getTableEnseignantHSup().setFillsViewportHeight(true);

		this.getTableEnseignantHSup().setRowHeight(25);

		this.contenuEnseignantHSup.add(scrollPane);
	}

	/**
	 * Panel des enseignements libres.
	 * 
	 * @return le contenu.
	 */
	public JPanel getContenuEnseignantHSup() {
		if (this.contenuEnseignantHSup == null)
			this.creerContenuEnseignantHSup();
		return this.contenuEnseignantHSup;
	}

	/**
	 * @return
	 */
	private JTable getTableEnseignantHSup() {
		return this.tableEnseignantHSup;
	}

	/**
	 * Crée le cadre de gauche contenant les informations importantes à
	 * l'utilisateur.
	 * 
	 */
	public void creerCadreGauche() {
		this.cadreGauche = new JPanel(
				new MigLayout("", "5[grow,fill]5", "[30]"));

		// this.cadreGauche.add(new JLabel("Filtres de recherche :"), "wrap");

		this.getListeEnseignants().setBorder(
				BorderFactory.createTitledBorder("Filtre de recherche :"));

		this.cadreGauche.add(this.getListeEnseignants(), "wrap");
		this.getListeEnseignants().setActionCommand("rechercher");
		this.getListeEnseignants().addActionListener(this.getListener());

		JButton choixDispo = new JButton("Voir les choix disponibles");
		choixDispo.setActionCommand("choixDispo");
		choixDispo.addActionListener(this.getListener());
		this.cadreGauche.add(choixDispo, "wrap");

		JButton refresh = new JButton("Rafraîchir");
		refresh.setActionCommand("rafraichir");
		refresh.addActionListener(this.getListener());
		this.cadreGauche.add(refresh, "wrap");
	}

	/**
	 * Retourne le panel de gauche.
	 * 
	 * @return panel de gauche.
	 */
	public JPanel getCadreGauche() {
		if (this.cadreGauche == null)
			this.creerCadreGauche();

		return this.cadreGauche;
	}

	/**
	 * Modifie le panel de gauche.
	 * 
	 * @param nouveauCadreGauche
	 *            le nouveau CadreGauche.
	 */
	public void setCadreGauche(JPanel nouveauCadreGauche) {
		this.cadreGauche = nouveauCadreGauche;
	}

	/**
	 * Formulaire d'ajout.
	 * 
	 * @return panel contenant le formulaire d'ajout.
	 */
	public JPanel getFormulaire() {
		return this.formulaire;
	}

	/**
	 * Affecte un nouveau formulaire d'ajout.
	 * 
	 * @param f
	 *            nouveau formulaire.
	 */
	public void setFormulaire(JPanel f) {
		this.formulaire = f;
	}

	/**
	 * Initialise le panel d'informations.
	 */
	public void creerInformations() {
		this.informations = new JPanel(new MigLayout("",
				"10[]10[grow,fill]10[]10"));

		this.informations.add(new Rectangle(ValidationRenderer.couleurs[0], 20,
				10));
		this.informations.add(new JLabel("Service en attente de validation"),
				"wrap");

		this.informations.add(new Rectangle(ValidationRenderer.couleurs[1], 20,
				10));
		this.informations.add(new JLabel("Service en conflit"), "wrap");

		this.informations.add(new Rectangle(ValidationRenderer.couleurs[2], 20,
				10));
		this.informations.add(new JLabel("Service validé"));
	}

	/**
	 * Panel d'informations.
	 * 
	 * @return le panel d'informations.
	 */
	public JPanel getInformations() {
		if (this.informations == null)
			this.creerInformations();

		return this.informations;
	}

	/**
	 * Affecte un nouveau panel d'information.
	 * 
	 * @param p
	 *            panel contenant les informations.
	 */
	public void setInformations(JPanel p) {
		this.informations = p;
	}

	/**
	 * Liste des cours.
	 * 
	 * @param force
	 *            Force la synchronisation avec la base de données.
	 * @return collection des cours.
	 */
	public Collection<Cours> getCollCours(boolean force) {
		if (this.collCours == null || force) {
			try {
				if (this.fab == null) {
					this.fab = FabriqueDao.getFabriqueDao();
				}
				DaoCours cours = this.fab.getDaoCours();
				cours.getConnexion().ouvrir();
				this.collCours = cours.findAll();
				Collections.sort((List<Cours>) this.collCours);
				cours.getConnexion().fermer();
			} catch (DaoException e) {
				Main.getJournal().logException(e, true);
				return null;
			}
		}
		return this.collCours;
	}

	/**
	 * Liste des cours.
	 * 
	 * @return collection des cours.
	 */
	public Collection<Cours> getCollCours() {
		return this.getCollCours(false);
	}

	/**
	 * Liste des cours.
	 * 
	 * @return collection des cours.
	 */
	public Object[] getCollCoursArray() {
		return this.getCollCours().toArray();
		/*
		 * Object[] ret = null; try { DaoCours cours =
		 * this.getFabrique().getDaoCours(); cours.getConnexion().ouvrir();
		 * this.collCours = cours.findAll(); ret = this.collCours.toArray();
		 * Arrays.sort(ret); cours.getConnexion().fermer(); } catch
		 * (DaoException e) { Main.getJournal().logException(e, true); return
		 * null; } return ret;
		 */
	}

	/**
	 * Liste des enseignants.
	 * 
	 * @param force
	 *            Force la synchronisation avec la base de données.
	 * 
	 * @return collection des enseignants.
	 */
	public Collection<Enseignant> getCollEnseignants(boolean force) {
		if (this.collEnseignants == null || force) {
			try {
				DaoEnseignant enseign = this.getFabrique().getDaoEnseignant();
				enseign.getConnexion().ouvrir();
				this.collEnseignants = enseign.findAll();
				Collections.sort((List<Enseignant>) this.collEnseignants);
				enseign.getConnexion().fermer();
			} catch (DaoException e) {
				Main.getJournal().logException(e);
			}
		}

		return this.collEnseignants;
	}

	/**
	 * Liste des enseignants.
	 * 
	 * @return collection des enseignants.
	 */
	public Collection<Enseignant> getCollEnseignants() {
		return this.getCollEnseignants(false);
	}

	/**
	 * Liste des enseignants.
	 * 
	 * @return tableau des enseignants.
	 */
	public Object[] getCollEnseignantsArray() {
		return this.getCollEnseignants().toArray();
		/*
		 * Object[] ret = null; try { DaoEnseignant enseign =
		 * this.getFabrique().getDaoEnseignant();
		 * enseign.getConnexion().ouvrir(); this.collEnseignants =
		 * enseign.findAll(); ret = this.collEnseignants.toArray();
		 * Arrays.sort(ret); enseign.getConnexion().fermer(); } catch
		 * (DaoException e) { Main.getJournal().logException(e, true); return
		 * null; } return ret;
		 */
	}

	/**
	 * Liste des services.
	 * 
	 * @param b
	 *            force la mise à jour.
	 * 
	 * @return collection des services.
	 */
	public Collection<Service> getCollServices(boolean b) {
		if (this.collServices == null || b) {
			try {
				DaoService services = this.getFabrique().getDaoService();
				services.getConnexion().ouvrir();
				this.collServices = services.findAll();
				services.getConnexion().fermer();
			} catch (DaoException e) {
				Main.getJournal().logException(e);
			}
		}

		Collections.sort((List<Service>) this.collServices);

		return this.collServices;
	}

	/**
	 * Liste des enseignements.
	 * 
	 * @return collection des enseignements.
	 */
	public Collection<Service> getCollServices() {
		return this.getCollServices(false);
	}

	/**
	 * Liste des enseignements.
	 * 
	 * @param b
	 *            force la mise à jour.
	 * 
	 * @return collection des enseignements.
	 */
	public Collection<Enseignement> getCollEnseignements(boolean b) {
		if (this.collEnseignements == null || b) {
			try {
				DaoService services = this.getFabrique().getDaoService();
				services.getConnexion().ouvrir();
				this.collEnseignements = services.findAllEnseignements();
				services.getConnexion().fermer();
			} catch (DaoException e) {
				Main.getJournal().logException(e);
			}
		}

		Collections.sort((List<Enseignement>) this.collEnseignements);

		return this.collEnseignements;
	}

	/**
	 * Liste des enseignements.
	 * 
	 * @return collection des enseignements.
	 */
	public Collection<Enseignement> getCollEnseignements() {
		return this.getCollEnseignements(false);
	}

	/**
	 * Liste des enseignements.
	 * 
	 * @param b
	 *            force la mise à jour.
	 * 
	 * @return collection des enseignements.
	 */
	public Collection<TacheAdministrative> getCollTachesAdministratives(
			boolean b) {
		if (this.collTachesAdministratives == null || b) {
			try {
				DaoService services = this.getFabrique().getDaoService();
				services.getConnexion().ouvrir();
				this.collTachesAdministratives = services
						.findAllTachesAdministratives();
				services.getConnexion().fermer();
			} catch (DaoException e) {
				Main.getJournal().logException(e);
			}
		}

		Collections
				.sort((List<TacheAdministrative>) this.collTachesAdministratives);

		return this.collTachesAdministratives;
	}

	/**
	 * Liste des enseignements.
	 * 
	 * @return collection des enseignements.
	 */
	public Collection<TacheAdministrative> getCollTachesAdministratives() {
		return this.getCollTachesAdministratives(false);
	}

	/**
	 * Connexion en cours.
	 * 
	 * @return fabrique utilisée.
	 */
	public FabriqueDao getFabrique() {
		return this.fab;
	}

	/**
	 * Liste des cours.
	 * 
	 * @return liste graphique des cours.
	 */
	public JComboBox getListeCours() {
		if (this.listeCours == null) {
			this.setListeCours();
		}

		return this.listeCours;
	}

	/**
	 * Liste des enseignants.
	 * 
	 * @return liste graphique des enseignants.
	 */
	public JComboBox getListeEnseignants() {
		if (this.listeEnseignants == null) {
			this.setListeEnseignants();
		}

		return this.listeEnseignants;
	}

	/**
	 * JTable utilisée pour les enseignements.
	 * 
	 * @return la table.
	 */
	public JTable getTableEns() {
		return this.tableEns;
	}

	/**
	 * Affecte une table pour les enseignements.
	 * 
	 * @param table
	 */
	public void setTableEns(JTable table) {
		this.tableEns = table;

		this.tableEns.getSelectionModel().setSelectionMode(
				ListSelectionModel.SINGLE_SELECTION);

		TableRowSorter<ServiceEnsTableModel> sorter = new TableRowSorter<ServiceEnsTableModel>(
				this.ensTableModel);
		this.tableEns.setRowSorter(sorter);

		ValidationRenderer validEnsInt = new ValidationRenderer(this
				.getTableEns().getDefaultRenderer(Integer.class));
		this.tableEns.setDefaultRenderer(Integer.class, validEnsInt);
		ValidationRenderer validEnsString = new ValidationRenderer(this
				.getTableEns().getDefaultRenderer(String.class));
		this.tableEns.setDefaultRenderer(String.class, validEnsString);
		ValidationRenderer validEnsBool = new ValidationRenderer(this
				.getTableEns().getDefaultRenderer(Boolean.class));
		this.tableEns.setDefaultRenderer(Boolean.class, validEnsBool);

		this.tableEns.getSelectionModel().addListSelectionListener(
				this.getListener());
	}

	/**
	 * Model de la JTable pour les enseignements.
	 * 
	 * @return le model.
	 */
	public ServiceEnsTableModel getEnsTableModel() {
		return this.ensTableModel;
	}

	/**
	 * JTable utilisée pour les tâches administratives.
	 * 
	 * @return la table.
	 */
	public JTable getTableTAdmin() {

		return this.tableTAdmin;
	}

	/**
	 * Affecte une table pour les tâches administratives.
	 * 
	 * @param table
	 */
	public void setTableTAdmin(JTable table) {
		this.tableTAdmin = table;

		this.tableTAdmin.getSelectionModel().setSelectionMode(
				ListSelectionModel.SINGLE_SELECTION);

		TableRowSorter<ServiceTAdminTableModel> sorter = new TableRowSorter<ServiceTAdminTableModel>(
				this.tAdminTableModel);
		this.tableTAdmin.setRowSorter(sorter);

		ValidationRenderer validTAdminInt = new ValidationRenderer(this
				.getTableTAdmin().getDefaultRenderer(Integer.class));
		this.tableTAdmin.setDefaultRenderer(Integer.class, validTAdminInt);
		ValidationRenderer validTAdminString = new ValidationRenderer(this
				.getTableTAdmin().getDefaultRenderer(String.class));
		this.tableTAdmin.setDefaultRenderer(String.class, validTAdminString);

		this.tableTAdmin.getSelectionModel().addListSelectionListener(
				this.getListener());
	}

	/**
	 * Model de la JTable pour les tâches relatives.
	 * 
	 * @return le model.
	 */
	public ServiceTAdminTableModel getTAdminTableModel() {
		return this.tAdminTableModel;
	}

	/**
	 * JTable utilisée pour les enseignements libres.
	 * 
	 * @return la table.
	 */
	public JTable getTableEnsDispo() {
		return this.tableEnsDispo;
	}

	/**
	 * Affecte une table pour les enseignements libres.
	 * 
	 * @param table
	 */
	public void setTableEnsDispo(JTable table) {
		this.tableEnsDispo = table;

		TableRowSorter<EnsLibreTableModel> sorter = new TableRowSorter<EnsLibreTableModel>(
				this.ensDispoTableModel);
		this.tableEnsDispo.setRowSorter(sorter);

		this.tableEnsDispo.getSelectionModel().addListSelectionListener(
				this.getListener());
	}

	/**
	 * Model de la JTable pour les enseignements libres.
	 * 
	 * @return le model.
	 */
	public EnsLibreTableModel getEnsDispoTableModel() {
		return this.ensDispoTableModel;
	}

	/**
	 * Affecte une table pour les enseignements libres.
	 * 
	 * @param table
	 */
	public void setTableEnseignantHSup(JTable table) {
		this.tableEnseignantHSup = table;

		TableRowSorter<HeureEnseignantTableModel> sorter = new TableRowSorter<HeureEnseignantTableModel>(
				this.enseignantHSupTableModel);
		this.getTableEnseignantHSup().setRowSorter(sorter);
	}

	/**
	 * Model de la JTable pour les enseignements libres.
	 * 
	 * @return le model.
	 */
	public HeureEnseignantTableModel getEnseignantHSupTableModel() {
		return this.enseignantHSupTableModel;
	}

	/**
	 * Affecte un écouteur d'événements.
	 * 
	 * @param ecouteur
	 */
	public void setListener(InterfaceListener ecouteur) {
		this.listener = ecouteur;
	}

	/**
	 * Retourne l'écouteur utilisé.
	 * 
	 * @return ecouteur.
	 */
	public InterfaceListener getListener() {
		return this.listener;
	}

	/**
	 * @return True si un choix de cours est selectionné.
	 */
	public boolean listeCoursNonVide() {
		return (this.listeCours.getSelectedIndex() > 0);
	}

	/**
	 * Dégrise le bouton valider.
	 */
	public abstract void validerBoutonAjout();

	/**
	 * Met à jour la table des données.
	 */
	public void rafraichir() {
		// Rafraichit la liste des enseignements
		this.getEnsTableModel().setDonnees(this.getCollEnseignements(true));
		this.getEnsTableModel().fireTableDataChanged();

		// Rafraichit la liste des tâches administratives
		this.getTAdminTableModel().setDonnees(
				this.getCollTachesAdministratives(true));
		this.getTAdminTableModel().fireTableDataChanged();

		// Rafraichit la liste des enseignements libres
		this.getEnsDispoTableModel().actualiserDonnees();
		this.getEnsDispoTableModel().fireTableDataChanged();

		// Rafraichit les statistiques des heures des enseignants
		this.getEnseignantHSupTableModel().actualiserDonnees();
		this.getEnseignantHSupTableModel().fireTableDataChanged();

		// Réinitialisation du filtre de recherche
		this.getListeEnseignants().setSelectedIndex(0);

		if (this instanceof UtilEnseignant)
			((UtilEnseignant) this).updateCadreGauche();
	}

	/**
	 * Met à jour la liste des cours à partir de la base de données.
	 * 
	 */
	public void setListeCours() {
		this.listeCours = new JComboBox(this.getCollCoursArray());
		this.listeCours.insertItemAt("-", 0);
		this.listeCours.setSelectedIndex(0);

		this.listeCours.addActionListener(this.getListener());
		this.listeCours.setActionCommand("choixCours");
	}

	/**
	 * Met à jour la liste des enseignants à partir de la base de données.
	 */
	public void setListeEnseignants() {
		if (this.listeEnseignants != null) {
			this.updateListEnseignants();
		} else {
			this.listeEnseignants = new JComboBox(this
					.getCollEnseignantsArray());
			this.listeEnseignants.insertItemAt("-", 0);
			this.listeEnseignants.setSelectedIndex(0);
		}
	}

	private void updateListEnseignants() {
		int index = -1;
		java.awt.Component c[] = this.cadreGauche.getComponents();
		for (int i = 0; i < c.length; i++) {
			if (c[i] == this.listeEnseignants)
				index = i;
		}

		if (index < 0) {
			Main.getJournal().logErreur(
					"Impossible de trouver la liste des enseignants actuelle");
			return;
		}
		// Création de la nouvelle liste
		this.listeEnseignants = new JComboBox(this.getCollEnseignants(true)
				.toArray());
		this.listeEnseignants.setBorder(BorderFactory
				.createTitledBorder("Enseignants"));
		this.listeEnseignants.insertItemAt("-", 0);
		this.listeEnseignants.setSelectedIndex(0);
		// Remplacement dans le JPanel
		this.cadreGauche.remove(index);
		this.cadreGauche.add(this.listeEnseignants, "wrap", index);
		this.cadreGauche.validate();
	}

	/**
	 * Réinitialise à leur valeurs par défaut les champs du formulaire
	 * permettant l'ajout d'un enseignement.
	 */
	public abstract void reInititaliseFormulaire();

	/**
	 * Filtre la liste des services par l'enseignant sélectionné.
	 * 
	 * @return l'index sélectionné.
	 */
	public int rechercher() {
		int ret = this.getListeEnseignants().getSelectedIndex();
		if (ret > 0) {
			Enseignant e = (Enseignant) this.getListeEnseignants()
					.getSelectedItem();

			this.getEnsTableModel().clearDonnees();
			this.getTAdminTableModel().clearDonnees();

			Collection<Service> collServ = this.getCollServices();
			Collections.sort((List<Service>) collServ);

			for (Service s : collServ) {
				if (s.getEnseignant().equals(e)) {
					if (s instanceof Enseignement) {
						this.getEnsTableModel().ajouterLigne((Enseignement) s);
					} else if (s instanceof TacheAdministrative) {
						this.getTAdminTableModel().ajouterLigne(
								(TacheAdministrative) s);
					}

				}
			}

			this.getEnsTableModel().fireTableDataChanged();
			this.getTAdminTableModel().fireTableDataChanged();

			this.getFrame().setStatus("Choix de " + e);
		} else {
			this.rafraichir();
		}

		return ret;
	}

	/**
	 * Accesseur pour frame
	 * 
	 * @return l'Interface
	 */
	public Interface getFrame() {
		return this.frame;
	}

	/**
	 * @return Le cours selectionné dans la JComboBox listeCours
	 */
	public Cours getCoursSelectionne() {
		return (Cours) this.listeCours.getSelectedItem();
	}

	/**
	 * @param formulaireTA
	 *            le nouveau formulaireTA
	 */
	public void setFormulaireTA(JPanel formulaireTA) {
		this.formulaireTA = formulaireTA;
	}

	/**
	 * @return le formulaireTA
	 */
	public JPanel getFormulaireTA() {
		return this.formulaireTA;
	}

	/**
	 * Active le bouton de gestion des enseignements.
	 */
	public abstract void activeGestionEns();

	/**
	 * Active le bouton de gestion des tâches administratives.
	 */
	public abstract void activeGestionTAdmin();

	/**
	 * Active/désactive le bouton de gestion.
	 * 
	 * @param b
	 *            active/désactive.
	 */
	public abstract void setGestionEnabled(boolean b);

	/**
	 * Gère les enseignements.
	 */
	public abstract void gereEns();

	/**
	 * Gère les tâches administratives.
	 */
	public abstract void gereTAdmin();

	/**
	 * Active/désactive le bouton de gestion des services disponibles.
	 * 
	 * @param b
	 *            active/désactive.
	 */
	public abstract void setGestionDispoEnabled(boolean b);

	/**
	 * Active la gestion des services disponibles.
	 */
	public abstract void activeGestionDispo();
}
